package com.moli.java.map.hashMap;

import java.util.HashMap;

/**
 * @program: JavaQuesDemo
 * @description: hashMap是线程不安全的集合
 * @author: zhangjt
 * @create: 2024-11-19 10:53
 **/
public class ThreadUnsafeMap {
    /*
    *
    * 可能的结果：
        数据丢失： 如果两个线程并发操作相同的 bucket（桶），在插入元素时可能会发生竞争条件，从而导致数据丢失。
        数据覆盖： 如果多个线程对同一个键执行 put() 操作，由于 HashMap 的非线程安全性，最终只会保存一个值，另一个值会被覆盖。
        死循环或异常： 如果多个线程同时修改 HashMap，可能会破坏内部结构，导致异常，如 ConcurrentModificationException。
    * */
    public static void main1(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                map.put(Thread.currentThread().getName() + i, "" + i);
                System.out.println(map);
            }
        });
        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                map.put(Thread.currentThread().getName() + i + 1000, "" + i);
                System.out.println(map);
            }
        });
        thread1.start();
        thread2.start();
        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(map.size());
    }

    public static void main(String[] args) {
        /*
        * HashMap最多只允许一条记录的键为null，允许多条记录的值为null
        * HashMap 的键值对允许有null，但是ConCurrentHashMap 都不允许
        * */
        HashMap<String, Object> map = new HashMap<>();
        map.put(null, null);
        map.put(null, 1);
        map.put(null, 2);
        map.put("key", null);
        map.put("mamakaka", null);
        System.out.println(map);
    }
}
